﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Office = Microsoft.Office.Core;
using DBConnect;
using System.Xml.Serialization;
using System.IO;
using DocumentFormat.OpenXml.Packaging;

namespace TISS_Add_in
{
    public class ProcedimentoHandler
    {
        #region Properties

        string numero;
        string codigo;
        string dataHora;
        string tipoTabela;
        int quantidadeMembros;
        int id;
        bool selecionado;

        public string TipoTabela
        {
            get { return tipoTabela; }
            set { tipoTabela = value; }
        }

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        
        public int QuantidadeMembros
        {
            get { return quantidadeMembros; }
            set { quantidadeMembros = value; }
        }

        public bool Selecionado
        {
            get { return selecionado; }
            set { selecionado = value; }
        }

        public string Numero
        {
            get { return numero; }
            set { numero = value; }
        }

        public string Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        public string DataHora
        {
            get { return dataHora; }
            set { dataHora = value; }
        }

        #endregion

        public ProcedimentoHandler()
        { 
        
        }

        public static List<ProcedimentoHandler> GetAllProcedimentosFromCustomXMLPart(Microsoft.Office.Core.CustomXMLPart cPart)
        {
            NameTable nt = new NameTable();
            XmlDocument partXML = new XmlDocument(nt);

            XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
            nsManager.AddNamespace("ans", "http://www.ans.gov.br/padroes/tiss/schemas");

            partXML.LoadXml(cPart.XML);

            //Localizando todos Procedimentos
            List<ProcedimentoHandler> procedimentos = new List<ProcedimentoHandler>();
            XmlNodeList procedimentosList = partXML.SelectNodes("//ans:procedimentos", nsManager);
            int procedimentoCount = 1;
            int membroCount = 1;

            foreach (XmlNode procedimento in procedimentosList)
            {
                //Calculando numero de Membros
                XmlNodeList membrosEquipe = procedimento.SelectNodes("ans:equipe//ans:membroEquipe", nsManager);
                foreach (XmlNode membroEquipe in membrosEquipe)
                {
                    if (membroEquipe.InnerText == "")
                    {
                        break;
                    }
                    else
                    {
                        membroCount++;
                    }
                }

                ProcedimentoHandler proc = new ProcedimentoHandler();
                proc.Selecionado = false;
                proc.QuantidadeMembros = membroCount;
                proc.Numero = procedimentoCount.ToString();
                proc.Codigo = procedimento.SelectSingleNode("ans:procedimento/ans:codigo", nsManager).InnerText;
                proc.DataHora = procedimento.SelectSingleNode("ans:data", nsManager).InnerText + " " + procedimento.SelectSingleNode("ans:horaInicio", nsManager).InnerText;
                proc.tipoTabela = procedimento.SelectSingleNode("ans:procedimento/ans:tipoTabela", nsManager).InnerText;
                procedimentos.Add(proc);
                procedimentoCount++;
                membroCount = 1;
            }
            return procedimentos;
        }

        public static void showStatusProcedimentos(long IDLote, GuiaSolicitacaoProcedimento classGuiaSolicProc, node_type tipoNode)
        {
            byte[] xmlBinario = CommandSolicitacao.buscaStatusProcFaturamento(classGuiaSolicProc.NumeroGuia, IDLote);
            XmlSerializer xs = new XmlSerializer(typeof(docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia));
            Stream stream = new MemoryStream(xmlBinario);
            docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia statusGuia = new TISS_Add_in.docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia();
            statusGuia = (docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia)xs.Deserialize(stream);

            List<string> guiasPaths = new List<string>();
            foreach (GuiaPath path in classGuiaSolicProc.GuiaPaths)
            {
                guiasPaths.Add(path.FilePath);
            }

            classGuiaSolicProc.GuiaSolicProc = LoteGuias.ExtraiGuiaCustomXML(guiasPaths.ToArray(), classGuiaSolicProc.TipoSolicitacao);
            //TODO: Pinda - Preencher Procedimentos do ClassGuiaSolicProc comparando se eh procedimento ou opm
            //TODO: Pinda - Pegar Array de Procedimentos e passar por parametro
            //showStatusProcedimentos((ct_itemSolicitacao[])((object[])statusGuia.procedimentosAnalisados), classGuiaSolicProc, tipoNode);
        }

        public static void showStatusProcedimentos(GuiaSolicitacaoProcedimento classGuiaSolicProc, node_type tipoNode)
        {
            ct_situacaoAutorizacaoDadosAutorizacao dadosAutorizacao = new ct_situacaoAutorizacaoDadosAutorizacao(); ;
            string filePath = "";
            foreach (GuiaPath path in classGuiaSolicProc.GuiaPaths)
            {
                if (!path.IsExtensao)
                    filePath = path.FilePath;
            }
            Stream str = XMLUtils.GetCustomXmlPart(filePath, "dadosAutorizacao");

            XmlSerializer xs = new XmlSerializer(typeof(ct_situacaoAutorizacao), XMLUtils.ElementRootWithANSnamespace("dadosAutorizacao"));
            dadosAutorizacao = (ct_situacaoAutorizacaoDadosAutorizacao)xs.Deserialize(str);
            str.Position = 0;

            if (dadosAutorizacao.procedimentos != null)
            {
                switch (classGuiaSolicProc.TipoSolicitacao)
                {
                    case TipoGuia.Solicitação_Internação:
                        SolicitacaoProcedimentos.geraEnviaGuiaSolicInternacao(ref classGuiaSolicProc);
                        break;
                    case TipoGuia.Solicitação_Prorrogação:
                        SolicitacaoProcedimentos.geraEnviaGuiaProrrogacao(ref classGuiaSolicProc);
                        break;
                    case TipoGuia.Solicitação_SADT:
                        SolicitacaoProcedimentos.geraEnviaGuiaSP_SADT(ref classGuiaSolicProc);
                        break;
                    case TipoGuia.Solicitação_Odontologia:

                        break;
                    default:
                        break;
                }
                showStatusProcedimentos(dadosAutorizacao.procedimentos, classGuiaSolicProc, tipoNode);
            }
        }

        private static void showStatusProcedimentos(ct_itemSolicitacao[] listaItemSolicitacao, GuiaSolicitacaoProcedimento classGuiaSolicProc, node_type tipoNode)
        {
            uc_StatusProcedimentos ucStatusProcedimentos = new uc_StatusProcedimentos();
            List<ct_itemSolicitacao> listaProcedimentos = new List<ct_itemSolicitacao>();
            List<ct_itemSolicitacao> listaOPMs = new List<ct_itemSolicitacao>();
            foreach (ct_itemSolicitacao item in listaItemSolicitacao)
            {
                foreach (Procedimento procSolic in classGuiaSolicProc.ListaProcedimentos)
                {
                    if (item.Equals(procSolic.procedimento))
                    {
                        if (procSolic.isOpm)
                            listaOPMs.Add((ct_itemSolicitacao)item);
                        else
                            listaProcedimentos.Add((ct_itemSolicitacao)item);
                    }
                }
            }
            ucStatusProcedimentos.ListaProcedimentos = listaProcedimentos;
            ucStatusProcedimentos.ListaOPMs = listaOPMs;
            ucStatusProcedimentos.TipoProcedimento = tipoNode;
            Globals.ThisAddIn.StatusProcedimentosCTP = Globals.ThisAddIn.CustomTaskPanes.Add(ucStatusProcedimentos, "Status dos Procedimentos da Guia de Faturamento");
            Globals.ThisAddIn.StatusProcedimentosCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
            Globals.ThisAddIn.StatusProcedimentosCTP.Width = 315;
            //Globals.ThisAddIn.GlosasCTP.Height = 325;
            Globals.ThisAddIn.StatusProcedimentosCTP.Visible = true;
            Globals.ThisAddIn.StatusProcedimentosCTP.Control.Focus();
        }
    }
}
